package service

import (
	"encoding/json"
	"io"
	"lsgfish/server/internal/config"
	"net/http"
)

type weatherService struct{}

// Weather 原始天气数据结构
type Weather struct {
	// 位置信息
	Location Location `json:"location"`
	// 当前天气信息
	Current Current `json:"current"`
}

// WeatherResponse API响应天气数据结构
// @Description 天气信息响应
type WeatherResponse struct {
	// 位置信息
	Location Location `json:"location"`
	// 当前天气信息
	Current Current `json:"current"`
}

// Location 位置信息
// @Description 位置信息
type Location struct {
	Name       string  `json:"name" example:"北京"`                       // 城市名称
	Region     string  `json:"region" example:"北京市"`                    // 地区
	Country    string  `json:"country" example:"中国"`                    // 国家
	Lat        float64 `json:"lat" example:"39.91"`                     // 纬度
	Lon        float64 `json:"lon" example:"116.40"`                    // 经度
	TzId       string  `json:"tz_id" example:"Asia/Shanghai"`           // 时区ID
	Localtime  string  `json:"localtime" example:"2023-08-20 15:30:45"` // 当地时间
	LocaltimeE int64   `json:"localtime_epoch" example:"1629417045"`    // 当地时间时间戳
}

// Current 当前天气信息
// @Description 当前天气信息
type Current struct {
	LastUpdatedEpoch int64   `json:"last_updated_epoch" example:"1629417000"` // 最后更新时间戳
	LastUpdated      string  `json:"last_updated" example:"2023-08-20 15:30"` // 最后更新时间
	TempC            float64 `json:"temp_c" example:"28.5"`                   // 温度摄氏度
	TempF            float64 `json:"temp_f" example:"83.3"`                   // 温度华氏度
	IsDay            int     `json:"is_day" example:"1"`                      // 是否白天
	// 天气状况
	Condition  Condition `json:"condition"`
	WindMph    float64   `json:"wind_mph" example:"5.6"`       // 风速英里/小时
	WindKph    float64   `json:"wind_kph" example:"9.0"`       // 风速千米/小时
	WindDegree int       `json:"wind_degree" example:"180"`    // 风向度数
	WindDir    string    `json:"wind_dir" example:"南风"`        // 风向
	PressureMb float64   `json:"pressure_mb" example:"1012.0"` // 气压毫巴
	PressureIn float64   `json:"pressure_in" example:"29.88"`  // 气压英寸
	PrecipMm   float64   `json:"precip_mm" example:"0.0"`      // 降水量毫米
	PrecipIn   float64   `json:"precip_in" example:"0.0"`      // 降水量英寸
	Humidity   int       `json:"humidity" example:"65"`        // 湿度百分比
	Cloud      int       `json:"cloud" example:"25"`           // 云量百分比
	FeelslikeC float64   `json:"feelslike_c" example:"30.2"`   // 体感温度摄氏度
	FeelslikeF float64   `json:"feelslike_f" example:"86.4"`   // 体感温度华氏度
	WindchillC float64   `json:"windchill_c" example:"28.5"`   // 风寒温度摄氏度
	WindchillF float64   `json:"windchill_f" example:"83.3"`   // 风寒温度华氏度
	HeatindexC float64   `json:"heatindex_c" example:"30.2"`   // 热指数摄氏度
	HeatindexF float64   `json:"heatindex_f" example:"86.4"`   // 热指数华氏度
	DewpointC  float64   `json:"dewpoint_c" example:"21.3"`    // 露点温度摄氏度
	DewpointF  float64   `json:"dewpoint_f" example:"70.3"`    // 露点温度华氏度
	VisKm      float64   `json:"vis_km" example:"10.0"`        // 能见度千米
	VisMiles   float64   `json:"vis_miles" example:"6.2"`      // 能见度英里
	Uv         float64   `json:"uv" example:"5.0"`             // 紫外线指数
	GustMph    float64   `json:"gust_mph" example:"11.2"`      // 阵风英里/小时
	GustKph    float64   `json:"gust_kph" example:"18.0"`      // 阵风千米/小时
}

// Condition 天气状况
// @Description 天气状况信息
type Condition struct {
	Text string `json:"text" example:"晴天"`                                             // 天气描述文本
	Icon string `json:"icon" example:"//cdn.weatherapi.com/weather/64x64/day/113.png"` // 天气图标
	Code int    `json:"code" example:"1000"`                                           // 天气代码
}

func NewWeatherService() *weatherService {
	return &weatherService{}
}

type WeatherService interface {
	GetWeatherByIP(ip string) (Weather, error)
}

func (s *weatherService) GetWeatherByIP(ip string) (Weather, error) {
	resp, err := http.Get("http://api.weatherapi.com/current.json?&q=" + ip + "&key=" + config.Conf.Weather.APIKey) //+ "&lang=zh"
	if err != nil {
		return Weather{}, err
	}
	defer resp.Body.Close()
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return Weather{}, err
	}
	var weather Weather
	err = json.Unmarshal(body, &weather)
	if err != nil {
		return Weather{}, err
	}
	return weather, nil
}
